home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 2 / CU Amiga Magazine's Super CD-ROM 02 (1996)(EMAP Images)(GB)[!][issue 1996-04].iso / magazine / amiga_e / cardall.e < prev    next >
Text File  |  1994-04-06  |  3KB  |  110 lines

  1. CONST MEMSTART=$600000, BLOCKSIZE=$100, FILEINFOSIZE=$20, MAGIC=$2000
  2. CONST HEADEROFF=2*BLOCKSIZE, BLKPTRSIZE=2, FILELEN=13
  3. CONST FREEOFF=HEADEROFF+BLOCKSIZE, HEADER=HEADEROFF+MEMSTART
  4. CONST FREEBLOCKS=FREEOFF+MEMSTART, EOFB=$FFFE, EOC=$FFFF, DEL=0, START=0
  5.  
  6. ENUM BAD_CARD, NO_FREE
  7.  
  8. OBJECT fileinfo
  9.   file, next
  10. ENDOBJECT
  11.  
  12. /* lastinfo is a block pointer with MAGIC, e.g., $213A (not $13A) */
  13. DEF thefiles:PTR TO fileinfo, lastfile:PTR TO fileinfo, lastinfo
  14.  
  15. PROC main() HANDLE
  16.   DEF f:PTR TO fileinfo
  17.   getinfo()
  18.   f:=thefiles.next
  19.   WHILE f
  20.     extractfile(f.file)
  21.     f:=f.next
  22.   ENDWHILE
  23. EXCEPT
  24.   SELECT exception
  25.   CASE BAD_CARD
  26.     WriteF('No PCMCIA card, or not from Notepad\n')
  27.   CASE NO_FREE
  28.     WriteF('No more free blocks -- card is full\n')
  29.   ENDSELECT
  30. ENDPROC
  31.  
  32. PROC extractfile(file)
  33.   DEF b, fh, i
  34.   IF deleted(file)
  35.     WriteF('Skipping deleted file\n')
  36.   ELSE
  37.     IF fh:=Open(name(file), NEWFILE)
  38.       WriteF('Extracting file "\s"\n', name(file))
  39.       b:=firstblock(file)
  40.       i:=size(file)
  41.       WHILE (b<>EOC) AND (b<>DEL)
  42.         Write(fh, address(b), IF i<BLOCKSIZE THEN i ELSE BLOCKSIZE)
  43.         i:=i-BLOCKSIZE
  44.         b:=follow(b)
  45.       ENDWHILE
  46.       Close(fh)
  47.     ELSE
  48.       WriteF('Cannot open output file "\s"\n', name(file))
  49.     ENDIF
  50.   ENDIF
  51. ENDPROC
  52.  
  53. PROC getinfo()
  54.   DEF info, nofiles=FALSE, atend=FALSE, file
  55.   file:=HEADER
  56.   lastinfo:=firstblock(file)
  57.   thefiles:=lastfile:=newfile(file)
  58.   IF validate(file)
  59.     file:=file+FILEINFOSIZE
  60.     REPEAT   /* for all info blocks */
  61.       REPEAT /* for all files */
  62.         IF blank(file)
  63.           nofiles:=TRUE
  64.         ELSE
  65.           lastfile.next:=newfile(file)
  66.           lastfile:=lastfile.next
  67.           file:=file+FILEINFOSIZE
  68.           IF Mod(file, BLOCKSIZE)=0 THEN atend:=TRUE
  69.         ENDIF
  70.       UNTIL atend OR nofiles
  71.       IF atend
  72.         info:=follow(lastinfo)
  73.     IF (info<>EOC) AND (info<>DEL)
  74.           lastinfo:=info
  75.           file:=address(lastinfo)
  76.           atend:=FALSE
  77.         ELSE
  78.           nofiles:=TRUE
  79.         ENDIF
  80.       ENDIF
  81.     UNTIL nofiles
  82.   ELSE
  83.     Raise(BAD_CARD)
  84.   ENDIF
  85. ENDPROC
  86.  
  87. PROC follow(block) RETURN int(blockaddr(block))
  88. PROC blockaddr(block) RETURN (block-MAGIC)*BLKPTRSIZE+FREEBLOCKS
  89. PROC address(block) RETURN (block-MAGIC)*BLOCKSIZE+MEMSTART
  90.  
  91. PROC validate(file)
  92.   RETURN StrCmp(name(file), 'NC', 2) AND (firstblock(file)=HEADEROFF+MAGIC)
  93. ENDPROC
  94.  
  95. PROC blank(file)
  96.   DEF n
  97.   FOR n:=0 TO FILEINFOSIZE-1 DO IF file[]++<>0 THEN RETURN FALSE
  98. ENDPROC TRUE
  99.  
  100. PROC deleted(file) RETURN file[]=0
  101. PROC name(file) RETURN file
  102. PROC size(file) RETURN int(file+14)
  103. PROC firstblock(file) RETURN int(file+20)
  104. PROC int(p) RETURN p[]++ OR Shl(p[],8)
  105.  
  106. PROC newfile(ptr)
  107.   DEF p
  108.   CopyMem([ptr, NIL]:fileinfo, p:=New(SIZEOF fileinfo), SIZEOF fileinfo)
  109. ENDPROC p
  110.